package logic;

import java.io.Serializable;
import java.util.HashMap;

// chave - isbndb = XRN25R26
// isbndb.com - Login: coolrent.noreply@gmail.com pass: P4ssCool321
// Cover - http://covers.openlibrary.org/b/isbn/<ISBN>-<SIZE:S, M, L>.jpg

public class Book implements RentableItem, Serializable, Comparable<Book> {

	private User owner;
	private User holder;
	private String title;
	private boolean available;
	private HashMap<String, Integer> ratings;
	private String author;
	private String isbn;

	
	
	/**
	 * Construtor
	 * @param owner Proprietário do livro.
	 * @param holder Titular do livro.
	 * @param title	Título do livro.
	 * @param author Autor do livro.
	 * @param isbn ISBN do livro.
	 * @param available Disponibilidade do livro.
	 */
	public Book(User owner, User holder, String title, String author,
			String isbn, boolean available) {
		this.owner = owner;
		this.holder = holder;
		this.author = author;
		this.title = title;
		this.available = available;
		this.ratings = new HashMap<String, Integer>();
		this.isbn = isbn;
	}
	
	/**
	 * Modifica o titular do livro.
	 * @param holder Nome do titular a ser modificado.
	 */
	public void setHolder(Teacher holder) {
		this.holder =  holder;
	}
	
	/**
	 * Retorna o titular do livro.
	 * @param 
	 */
	public Teacher getHolder() {
		return (Teacher) holder;
	}
	
	/**
	 * Retorna o proprietário do livro.
	 * @return
	 */
	@Override
	public Teacher getOwner() {
		return (Teacher) owner;
	}
	
	/**
	 * Verifica se o livro esta disponível.
	 * @return
	 */
	@Override
	public boolean available() {
		return available;
	}
	
	/**
	 * Modifica a disponibilidade do Livro.
	 * @param available
	 */
	public void setAvailable(boolean available) {
		this.available = available;
	}
	
	/**
	 * Classifica o livro com uma nota entre 1 e 5.
	 */
	@Override
	public void rate(String userId, int points) throws Exception {
		if (points < 1 || points > 5)
			throw new Exception("Nota inválida.");
		ratings.put(userId, points);
	}
	
	/**
	 * Retorna a nota de classificação do livro.
	 * @return
	 */
	public double getRate(){
		int soma = 0;
		if (ratings.size() == 0) {
			return 0;
		}
		for (Integer nota : ratings.values()) {
			soma += nota;
		}
		return soma / ratings.size();
	}
	
	/**
	 * Retorna o Título do livro.
	 * @return
	 */
	public String getTitle() {
		return title;
	}
	
	/**
	 * Retorna o Autor do livro.
	 * @return
	 */
	public String getAuthor() {
		return author;
	}
	
	
	@Override
	public int compareTo(Book book) {
		double delta = 0;
		try {
			delta = this.getRate() - book.getRate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		double tolerance = 0.0000001;
		if (delta > tolerance)
			return 1;
		else if (delta < tolerance)
			return -1;
		return 0;
	}
	
	/**
	 * Verifica se dois livros são iguais a partir do ISBN.
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Book) {
			return ((Book) obj).getISBN().equals(getISBN());
		}
		return false;
	}
	
	/**
	 * Retorna o ISBN do livro.
	 * @return
	 */
	public String getISBN() {
		return isbn;
	}

}
